/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager;

import br.com.foxinline.entidades.Iptu;
import br.com.foxinline.entidades.gtm.*;
import br.com.foxinline.servicos.ImovelServico;
import br.com.foxinline.util.CnpjValidator;
import br.com.foxinline.util.CpfValidator;
import br.com.foxinline.util.Msg;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerImovel implements Serializable {

    @EJB
    ImovelServico imovelServico;
    private Imovel imovel;
    private List<Imovel> lstImovel;
    private Contribuinte contribuinte;
    private Logradouro logradouro;
    private Long count;
    private List<Imovel> imovelfilter;
    private File arquivo;
    private File diretorio;
    private String ids;
    private List<Mudanca> mudancas;
    private boolean cpfCnpj;
    private boolean fatorLocalizacao;
    private boolean endereco;
    private boolean pedologia;
    private boolean revestimentoExterno;
    private boolean piso;
    private boolean cobertura;
    private boolean instalacaoSanitaria;
    private boolean tipoConstrucao;
    private boolean estadoConservacao;
    private boolean instalacaoEletrica;
    private boolean servicosUrbanos;
    private boolean usaValorAntigo;
    private boolean alterarFatorLocalizacao;
    
    private String localizacao;

    @PostConstruct
    public void init() {
//        try {
//
//            criarDiretorio();
//
//            lerArquivosDiretorio();
//
//            imovel = imovelServico.getProximoImovelPendente(ids);
//            criarIdArquivo(imovel.getId());
//
//        } catch (FileNotFoundException ex) {
//            ex.printStackTrace();
//            Logger.getLogger(ManagerImovel.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (IOException ex) {
//            ex.printStackTrace();
//            Logger.getLogger(ManagerImovel.class.getName()).log(Level.SEVERE, null, ex);
//        }

//        imovelServico.atualizarInformacoesImovel();
//        lstImovel = imovelServico.getImoveisAtualizados();


//        usaValorAntigo = true;
//        calc();
        
//        System.err.println(" ################################################## ");
//        lstImovel = imovelServico.findAll();
//        System.err.println(" ---------------------------------------------------");
//        usaValorAntigo = false;
//        alterarFatorLocalizacao = true;
//        calc();
        

        /**
         * --0 - Não isento --1 - isento informado no bci iptu --2 - isento
         * servidor municipal --3 - viuva --4 - cancelado - motivo desconhecido
         * --5 - cancelado - mudanca de lote --6 - cancelado - imovel foi
         * unificado --7 - cancelado - comercio nao existe mais --8 - cancelado
         * - residencia inexistente --9 - isento dominio da uniao
         */
//        System.err.println(imovelServico.getValorTotalImovelAtualizado());
//        System.err.println(imovelServico.getValorTotalImovelNormal());
//        System.err.println(imovelServico.getValorTotalImovelComFatorLocalizacaoAtualizado());
//        System.err.println(imovelServico.getValorTotalImovelComAjustes());
//        System.err.println("Não Isento: " + imovelServico.getValorPorIsencoes(0));
//        System.err.println("Isento Informado no IPTU: " + imovelServico.getValorPorIsencoes(1));
//        System.err.println("Isento Servidor: " + imovelServico.getValorPorIsencoes(2));
//        System.err.println("Isento Viuva: " + imovelServico.getValorPorIsencoes(3));
//        System.err.println("Isento cancelado: "
//                + (imovelServico.getValorPorIsencoes(4)
//                + imovelServico.getValorPorIsencoes(5)
//                + imovelServico.getValorPorIsencoes(6)
//                + imovelServico.getValorPorIsencoes(7)
//                + imovelServico.getValorPorIsencoes(8)));
//        System.err.println("Isento dominio da uniao: " + imovelServico.getValorPorIsencoes(9));
    }

    public String getLocalizacao() {
        return localizacao;
    }

    public void setLocalizacao(String localizacao) {
        this.localizacao = localizacao;
    }

    
    public void proximo() {
        init();
    }

    private void criarIdArquivo(Integer id) {
        criarDiretorio();
        arquivo = new File("/tmp/atlas/".concat(id.toString()).concat(".txt"));

        if (!arquivo.exists()) {
            try {
                arquivo.createNewFile();
            } catch (IOException ex) {
                Logger.getLogger(ManagerImovel.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    private void criarDiretorio() {
        diretorio = new File("/tmp/atlas");

        if (!diretorio.exists()) {
            diretorio.mkdir();
        }
    }

    private void lerArquivosDiretorio() throws FileNotFoundException, IOException {
        File[] files = diretorio.listFiles();

        ids = "(";

        for (int i = 0; i < files.length; i++) {
            if (i != files.length - 1) {
                ids += files[i].getName().replace(".txt", ", ");
            } else {
                ids += files[i].getName().replace(".txt", "");
            }
        }

        ids += ")";
    }

    private void removerIdArquivo(Integer id) throws IOException {

        File arquivoId = new File("/tmp/atlas/".concat(id.toString()).concat(".txt"));
        arquivoId.delete();
    }

    public List<Imovel> getLstImovel() {
        return lstImovel;
    }

    public void setLstImovel(List<Imovel> lstImovel) {
        this.lstImovel = lstImovel;
    }

    public Long getCount() {
        return count;
    }

    public void setCount(Long count) {
        this.count = count;
    }

    private BigDecimal ufmp(Integer qtd) {
        return getUfmp().multiply(new BigDecimal(qtd));
    }

    private BigDecimal getUfmp() {
        return new BigDecimal("2.54");
    }

    /**
     *
     * @param bairro
     */
    private BigDecimal getBairro(Imovel b) {

        String bairro = b.getCodigoDoBairro().getNomeDoBairro().trim();
        if (bairro.equalsIgnoreCase("CENTRO")) {
//            return new BigDecimal("250");
            return new BigDecimal("36.58");
        } else if (bairro.equalsIgnoreCase("NOVA PARNAIBA")) {
//            return new BigDecimal("100");
            return new BigDecimal("16.26");
        } else if (bairro.equalsIgnoreCase("N. SRA. DE FATIMA") || bairro.equalsIgnoreCase("SAO FRANCISCO")
                || bairro.equalsIgnoreCase("CEARA") || bairro.equalsIgnoreCase("PINDORAMA")
                || bairro.equalsIgnoreCase("BOA ESPERANÇA")
                || bairro.equalsIgnoreCase("SAO BENEDITO")
                || bairro.equalsIgnoreCase("RODOVIARIA")
                || bairro.equalsIgnoreCase("RODOVIARIO")
                || bairro.equalsIgnoreCase("B. CAMPOS")
                || bairro.equalsIgnoreCase("DIRCEU ARCOVERDE")
                || bairro.equalsIgnoreCase("B. RODOVIARIA")) {
//            return new BigDecimal("150");
            return new BigDecimal("12.19");
        } else if (bairro.equalsIgnoreCase("SAO JOSE") || bairro.equalsIgnoreCase("SANTA LUZIA")
                || bairro.equalsIgnoreCase("PIAUI") || bairro.equalsIgnoreCase("SAO JUDAS TADEU")
                || bairro.equalsIgnoreCase("JOAO XXIII")
                || bairro.equalsIgnoreCase("CATANDUVAS")) {
//            return new BigDecimal("80");
            return new BigDecimal("8.13");
        } else if (bairro.equalsIgnoreCase("REIS VELOSO")) {
            if (b.getFatorLocalizacao() == 18) {
//                return new BigDecimal("150");
                return new BigDecimal("16.26");
            }
            if (b.getFatorLocalizacao() == 24) {
//                return new BigDecimal("250");
                return new BigDecimal("25");
            }
            if (b.getFatorLocalizacao() == 5 || b.getFatorLocalizacao() == 12) {
//                return new BigDecimal("120");
                return new BigDecimal("12.19");
            }
        } else if (bairro.equalsIgnoreCase("Floriópolis e Portinho")) {
            return new BigDecimal("4.06");
        } else if (bairro.equalsIgnoreCase("Jardim America")) {
            return new BigDecimal("4.87");
        } else if (bairro.equalsIgnoreCase("ALTO SANTA MARIA")) {
            return new BigDecimal("3.25");
        } else {
            return new BigDecimal("8.13");
        }

        return null;
    }

    private void calc() {
        BigDecimal resul = BigDecimal.ZERO;
        BigDecimal ign = BigDecimal.ZERO;

        for (Imovel b : lstImovel) {
            System.err.println("#" + b.getId());

            Iptu i = new Iptu();

            i.setCreateat(new Date());

            BigDecimal vvt = correcaoVvt(vvt(b));

            BigDecimal vve = correcaoVve(vve(b));

            BigDecimal vvi = vvt.add(vve);

            BigDecimal tcc = tcc(b);
            BigDecimal tcl = tcl(b);
            BigDecimal tlp = tlp(b);

            BigDecimal iptu = null;


            //IPTU CORRIGIDO

            if (b.getCodigoDaUtilizacao() != null) {
                if (b.getCodigoDaUtilizacao() == 1) {
                    i.setAliquota(new BigDecimal("1.5"));
                    iptu = vvi.multiply(new BigDecimal("0.015")).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
                    //b.setTipoinsencao(5);

                } else if (b.getCodigoDaUtilizacao() == 2 && vvi.compareTo(ufmp(800)) == -1) {
                    iptu = vvi.multiply(new BigDecimal("0.01")).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
                    i.setAliquota(new BigDecimal("1"));

                } else if (b.getCodigoDaUtilizacao() == 2 && vvi.compareTo(ufmp(800)) == 1 && vvi.compareTo(ufmp(8700)) == -1) {
                    i.setAliquota(new BigDecimal("1"));
                    iptu = vvi.multiply(new BigDecimal("0.01")).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
                    //b.setTipoinsencao(1);

                } else if (b.getCodigoDaUtilizacao() == 2 && (vvi.compareTo(ufmp(8700)) == 1
                        || vvi.compareTo(ufmp(8700)) == 0)) {
                    i.setAliquota(new BigDecimal("1.5"));
                    iptu = vvi.multiply(new BigDecimal("0.015")).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
                    //b.setTipoinsencao(2);

                } else if ((b.getCodigoDaUtilizacao() == 3 || b.getCodigoDaUtilizacao() == 4 || b.getCodigoDaUtilizacao() == 5)
                        && (vvi.compareTo(ufmp(2900)) == 0 || vvi.compareTo(ufmp(2900)) == -1)) {
                    i.setAliquota(new BigDecimal("1"));
                    iptu = vvi.multiply(new BigDecimal("0.01")).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
                    //  b.setTipoinsencao(3);

                } else if ((b.getCodigoDaUtilizacao() == 3 || b.getCodigoDaUtilizacao() == 4 || b.getCodigoDaUtilizacao() == 5) && (vvi.compareTo(ufmp(2900)) == 1)) {
                    i.setAliquota(new BigDecimal("1.5"));
                    iptu = vvi.multiply(new BigDecimal("0.015")).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
                    //b.setTipoinsencao(4);
                } else {
                    System.err.println("SEM CÁLCULO: " + b.getId());
                }
            } else {
                iptu = vvi.multiply(new BigDecimal("0.01")).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
                i.setAliquota(new BigDecimal("1"));
            }

            if (iptu != null) {
                BigDecimal valor = (iptu.add(tcc).add(tcl).add(tlp));
                i.setValorBase(valor);

                valor = valor.multiply(getUfmp()).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);

                resul = resul.add(valor);
                if (b.getCodigoDoContribuinte() != null && b.getCodigoDoContribuinte().getNome().contains("IGN")) {
                    ign = ign.add(valor);
                }

                i.setValorBaseCorrigido(valor);

            }

            i.setVvt(vvt);
            i.setVve(vve);
            i.setVvi(vvi);
            i.setIptu(iptu);
            i.setTcc(tcc);
            i.setTcl(tcl);
            i.setTlp(tlp);

//            if (usaValorAntigo) {
//                b.setIptu(i);
//            } else 
                if (alterarFatorLocalizacao) {
                //b.setIptuComFatorModificado(i);
                b.setIptuComAjustesNoBairro(i);
            } 
//                else {
//                b.setIptuNovo(i);
//            }
            imovelServico.update(b);
        }

    }

    public List<Imovel> getImovelfilter() {
        return imovelfilter;
    }

    public void setImovelfilter(List<Imovel> imovelfilter) {
        this.imovelfilter = imovelfilter;
    }

    public void setImovel(List<Imovel> imovel) {
        this.lstImovel = imovel;
    }

    public BigDecimal vm2terreno(Imovel imovel) {
        if (imovel.getCodigoDaOcupacao() == 3) {
            return new BigDecimal("20000");
        }
        return new BigDecimal("28000");
    }

    public BigDecimal fatorLocalizacao(Imovel imovel) {

        //BAIRRO, NOVO FATOR LOCALIZAÇÃO
        Map<Integer, Integer> bairro = new HashMap<Integer, Integer>();
        //CENTRO
        bairro.put(1, 24);
        //REIS VELOSO
        bairro.put(5, 24);
        //RODOVIARIA 
        bairro.put(22, 18);
        bairro.put(37, 18);
        bairro.put(39, 18);
        //NOVA PARNAÍBA
        bairro.put(3, 18);
        //PIAUÍ
        bairro.put(32, 18);
        //J ESPERANCA
        bairro.put(9, 12);
        //DIRCEU ARCOVERDE
        bairro.put(1013, 18);
        bairro.put(34, 18);
        //CEARA
        bairro.put(27, 18);
        //SAO FRANCISCO
        bairro.put(12, 12);
        //SAO JOSÉ
        bairro.put(2, 12);
        //SANTA LUZIA 
        bairro.put(26, 12);

        //ID logradouro, valor do fator
        Map<Integer, Integer> logradouro = new HashMap<Integer, Integer>();
        
        //SÃO SEBASTIÃO
        logradouro.put(184, 24);
        logradouro.put(1205, 24);
        logradouro.put(1366, 24);
        logradouro.put(3989, 24);
        logradouro.put(5639, 24);
        
        //PINHEIRO MACHADO
        logradouro.put(69, 24);
        logradouro.put(410, 24);
        logradouro.put(1239, 24);
        logradouro.put(1344, 24);
        logradouro.put(1348, 24);
        logradouro.put(1450, 24);
        logradouro.put(1510, 24);
        logradouro.put(3336, 24);
        logradouro.put(3370, 24);
        logradouro.put(5609, 24);
        logradouro.put(5628, 24);
        
        //AV. PRESIDENTE VARGAS
        logradouro.put(1196, 24);
        logradouro.put(1198, 24);
        logradouro.put(1204, 24);
        logradouro.put(1315, 24);
        logradouro.put(1316, 24);
        logradouro.put(1434, 24);
        logradouro.put(1460, 24);
        logradouro.put(1465, 24);
        logradouro.put(3142, 24);
        logradouro.put(3907, 24);
        
        //CHAGAS RODRIGUES
        logradouro.put(1198, 24);
        logradouro.put(1210, 24);
        logradouro.put(1456, 24);
        logradouro.put(1459, 24);
        logradouro.put(1462, 24);
        logradouro.put(3555, 24);
        logradouro.put(3719, 24);
        

        if (imovel.getFatorLocalizacao() == null) {
            return new BigDecimal("0.12");
        }
        
       
        
        if(alterarFatorLocalizacao &&  imovel.getCodigoLogradouro() != null &&
                logradouro.get(imovel.getCodigoLogradouro().getId()) != null &&
                logradouro.get(imovel.getCodigoLogradouro().getId()) > imovel.getFatorLocalizacao()){
            
            imovel.setFatorLocalizacaoNovo(logradouro.get(imovel.getCodigoLogradouro().getId()));            
            return new BigDecimal(logradouro.get(imovel.getCodigoLogradouro().getId())).divide(new BigDecimal("100"));
            
        }else if(alterarFatorLocalizacao &&  imovel.getCodigoDoBairro() != null
                &&  bairro.get(imovel.getCodigoDoBairro().getId()) != null && 
                bairro.get(imovel.getCodigoDoBairro().getId()) > imovel.getFatorLocalizacao()){
            
            imovel.setFatorLocalizacaoNovo(bairro.get(imovel.getCodigoDoBairro().getId()));
            return new BigDecimal(bairro.get(imovel.getCodigoDoBairro().getId())).divide(new BigDecimal("100"));
            
        }else if (alterarFatorLocalizacao && imovel.getFatorLocalizacao() == 5
                && (imovel.getCodigoDoBairro() != null && (imovel.getCodigoDoBairro().getId() == 25
                || imovel.getCodigoDoBairro().getId() == 26
                || imovel.getCodigoDoBairro().getId() == 27
                || imovel.getCodigoDoBairro().getId() == 39
                || imovel.getCodigoDoBairro().getId() == 17
                || imovel.getCodigoDoBairro().getId() == 34
                || imovel.getCodigoDoBairro().getId() == 12
                || imovel.getCodigoDoBairro().getId() == 10
                || imovel.getCodigoDoBairro().getId() == 18
                || imovel.getCodigoDoBairro().getId() == 25
                || imovel.getCodigoDoBairro().getId() == 2
                || imovel.getCodigoDoBairro().getId() == 13
                || imovel.getCodigoDoBairro().getId() == 3481
                || imovel.getCodigoDoBairro().getId() == 5
                || imovel.getCodigoDoBairro().getId() == 3376
                || imovel.getCodigoDoBairro().getId() == 37
                || imovel.getCodigoDoBairro().getId() == 32
                || imovel.getCodigoDoBairro().getId() == 38
                || imovel.getCodigoDoBairro().getId() == 8
                || imovel.getCodigoDoBairro().getId() == 1013
                || imovel.getCodigoDoBairro().getId() == 1
                || imovel.getCodigoDoBairro().getId() == 22
                || imovel.getCodigoDoBairro().getId() == 3
                || imovel.getCodigoDoBairro().getId() == 14
                || imovel.getCodigoDoBairro().getId() == 35
                || imovel.getCodigoDoBairro().getId() == 9
                || imovel.getCodigoDoBairro().getId() == 1088))) {
            return new BigDecimal("0.12");
        }

        return new BigDecimal(imovel.getFatorLocalizacao()).divide(new BigDecimal("100"));
    }

    public BigDecimal topografia(Imovel imovel) {
        switch (imovel.getCodigoDaTopografia()) {
            case 1:
                return new BigDecimal("1");
            case 2:
                return new BigDecimal("0.9");
            case 3:
                return new BigDecimal("0.8");
            default:
                return new BigDecimal("1");
        }

    }

    public BigDecimal situacao(Imovel imovel) {
        switch (imovel.getCodigoSituacaoTerreno()) {
            case 1:
                return new BigDecimal("1.10");
            case 2:
                return new BigDecimal("1");
            case 3:
                return new BigDecimal("0.8");
            default:
                return new BigDecimal("1");
        }
    }

    public BigDecimal pedologia(Imovel imovel) {

        switch (imovel.getCodigoDaPedologia()) {
            case 1:
                return new BigDecimal("0.60");
            case 2:
                return new BigDecimal("0.70");
            case 3:
                return new BigDecimal("0.80");
            case 4:
                return new BigDecimal("1");
            case 5:
                return new BigDecimal("1.90");
            default:
                return new BigDecimal("1");
        }
    }

    public BigDecimal valorReferencia() {
        return new BigDecimal("6");
    }

    public BigDecimal indiceReferencia() {
        return (valorReferencia().divide(new BigDecimal("1.165"), 2, RoundingMode.HALF_UP));
    }

    public BigDecimal areadoterreno(Imovel imovel) {
        List<Imovel> exist = imovelServico.existeUnidade(imovel);

        if (imovel.getCodigoDaUtilizacao() != null && imovel.getCodigoDaUtilizacao() == 1
                || (exist == null || exist.isEmpty() || exist.size() == 1)) {
            return imovel.getAreaDoTerreno();
        } else if (imovel.getAreaDaUnidade().compareTo(BigDecimal.ZERO) == 1) {
            BigDecimal fi = imovel.getAreaDoTerreno().multiply(imovel.getAreaDaUnidade());

            if (imovel.getAreaConstruida().compareTo(BigDecimal.ZERO) == 0) {
                return fi.divide(imovelServico.areaconstruidaUnidades(imovel), 2, RoundingMode.HALF_UP);
            } else {
                return fi.divide(imovel.getAreaConstruida(), 2, RoundingMode.HALF_UP);
            }
        } else {
            return imovel.getAreaDoTerreno();
        }
    }

    public BigDecimal vvt(Imovel imovel) {
        BigDecimal calc = areadoterreno(imovel).multiply(vm2terreno(imovel))
                .multiply(fatorLocalizacao(imovel)).multiply(topografia(imovel))
                .multiply(situacao(imovel)).multiply(pedologia(imovel));
        return calc;
    }

    public BigDecimal vvtBairro(Imovel imovel) {
        BigDecimal calc = areadoterreno(imovel).multiply(getBairro(imovel))
                .multiply(fatorLocalizacao(imovel)).multiply(topografia(imovel))
                .multiply(situacao(imovel)).multiply(pedologia(imovel));
        return calc;
    }

    public BigDecimal correcaoVvt(BigDecimal bd) {
        return bd.divide(new BigDecimal("5275.75"), 8, RoundingMode.HALF_UP)
                .multiply(indiceReferencia()).divide(new BigDecimal("1.0641"), 2, RoundingMode.HALF_UP);
    }

    public BigDecimal correcaoVve(BigDecimal bd) {
        return (bd.divide(new BigDecimal("5275.75"), 9, RoundingMode.HALF_UP)
                .multiply(indiceReferencia()).divide(new BigDecimal("1.0641"), 9, RoundingMode.HALF_UP)).multiply(new BigDecimal("1000")).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
    }

    public BigDecimal vm2edificacao(Imovel imovel) {
        return new BigDecimal("8");
    }

    public BigDecimal caracteristicasImovel(Imovel imovel) {
        int calc = 0;

        //REVESTIMENTO
        if (usaValorAntigo && imovel.getCodRevestimentoAntigo() != null) {
            switch (imovel.getCodRevestimentoAntigo()) {
                case 1:
                    calc = 0;
                    break;
                case 2:
                    calc += 23;
                    break;
                case 3:
                    calc += 17;
                    break;
                case 4:
                    calc += 12;
                    break;
                case 5:
                    calc += 20;
                    break;
            }
        } else {
            if (imovel.getCodRevestimento() != null) {
                switch (imovel.getCodRevestimento()) {
                    case 1:
                        calc = 0;
                        break;
                    case 2:
                        calc += 23;
                        break;
                    case 3:
                        calc += 17;
                        break;
                    case 4:
                        calc += 12;
                        break;
                    case 5:
                        calc += 20;
                        break;
                }
            } else {
                calc += 0;
            }
        }

        //PISOS
        if (usaValorAntigo && imovel.getCodigoPisoAntigo() != null) {
            switch (imovel.getCodigoPisoAntigo()) {
                case 1:
                    calc += 0;
                    break;
                case 2:
                    calc += 10;
                    break;
                case 3:
                    calc += 17;
                    break;
                case 4:
                    calc += 20;
                    break;
            }
        } else {
            if (imovel.getCodigoPiso() != null) {
                switch (imovel.getCodigoPiso()) {
                    case 1:
                        calc += 0;
                        break;
                    case 2:
                        calc += 10;
                        break;
                    case 3:
                        calc += 17;
                        break;
                    case 4:
                        calc += 20;
                        break;
                }
            } else {
                calc += 0;
            }
        }

        //FORROS
        if (imovel.getCodigoDoForro() != null) {
            switch (imovel.getCodigoDoForro()) {
                case 1:
                    calc += 0;
                    break;
                case 2:
                    calc += 3;
                    break;
                case 3:
                    calc += 3;
                    break;
                case 4:
                    calc += 4;
                    break;
            }
        } else {
            calc += 0;
        }

        //COBERTURA
        if (usaValorAntigo && imovel.getCodigoDaCoberturaAntigo() != null) {
            switch (imovel.getCodigoDaCoberturaAntigo()) {
                case 1:
                    calc += 3;
                    break;
                case 2:
                    calc += 6;
                    break;
                case 3:
                    calc += 8;
                    break;
                case 4:
                    calc += 10;
                    break;
            }
        } else {
            if (imovel.getCodigoDaCobertura() != null) {
                switch (imovel.getCodigoDaCobertura()) {
                    case 1:
                        calc += 3;
                        break;
                    case 2:
                        calc += 6;
                        break;
                    case 3:
                        calc += 8;
                        break;
                    case 4:
                        calc += 10;
                        break;
                }

            } else {
                calc += 8;
            }
        }

        //INSTALACOES SANITÁRIAS
        if (usaValorAntigo && imovel.getCodigoInstSanitariaAntigo() != null) {
            switch (imovel.getCodigoInstSanitariaAntigo()) {
                case 1:
                    calc += 0;
                    break;
                case 2:
                    calc += 1;
                    break;
                case 3:
                    calc += 2;
                    break;
                case 4:
                    calc += 3;
                    break;
            }
        } else {
            if (imovel.getCodigoInstSanitaria() != null) {
                switch (imovel.getCodigoInstSanitaria()) {
                    case 1:
                        calc += 0;
                        break;
                    case 2:
                        calc += 1;
                        break;
                    case 3:
                        calc += 2;
                        break;
                    case 4:
                        calc += 3;
                        break;
                }
            } else {
                calc += 0;
            }
        }

        //INSTALACOES ELETRICAS
        if (usaValorAntigo && imovel.getCodInstEletricaAntigo() != null) {
            switch (imovel.getCodInstEletricaAntigo()) {
                case 1:
                    calc += 0;
                    break;
                case 2:
                    calc += 8;
                    break;
                case 3:
                    calc += 12;
                    break;
            }
        } else {
            if (imovel.getCodInstEletrica() != null) {
                switch (imovel.getCodInstEletrica()) {
                    case 1:
                        calc += 0;
                        break;
                    case 2:
                        calc += 8;
                        break;
                    case 3:
                        calc += 12;
                        break;
                }
            } else {
                calc += 0;
            }
        }

        //CONCRETO
        if (usaValorAntigo && imovel.getCodigoDaEstruturaAntigo() != null) {
            switch (imovel.getCodigoDaEstruturaAntigo()) {
                case 1:
                    calc += 28;
                    break;
                case 2:
                    calc += 18;
                    break;
                case 3:
                    calc += 11;
                    break;
                case 4:
                    calc += 26;
                    break;
            }
        } else {
            if (imovel.getCodigoDaEstrutura() != null) {
                switch (imovel.getCodigoDaEstrutura()) {
                    case 1:
                        calc += 28;
                        break;
                    case 2:
                        calc += 18;
                        break;
                    case 3:
                        calc += 11;
                        break;
                    case 4:
                        calc += 26;
                        break;
                }
            } else {
                calc += 28;
            }
        }
        return new BigDecimal(calc).divide(new BigDecimal("100"));

    }

    public BigDecimal conservacao(Imovel imovel) {
        if (usaValorAntigo && imovel.getCodEstadoConservacaoAntigo() != null) {
            switch (imovel.getCodEstadoConservacaoAntigo()) {
                case 1:
                    return new BigDecimal("1");
                case 2:
                    return new BigDecimal("0.8");
                case 3:
                    return new BigDecimal("0.5");
            }
        } else {
            if (imovel.getCodEstadoConservacao() != null) {
                switch (imovel.getCodEstadoConservacao()) {
                    case 1:
                        return new BigDecimal("1");
                    case 2:
                        return new BigDecimal("0.8");
                    case 3:
                        return new BigDecimal("0.5");
                }
            } else {
                return new BigDecimal("1");
            }
        }

        return new BigDecimal("0");
    }

    public BigDecimal subtipo(Imovel imovel) {
        if (imovel.getCodigoDaPosicao() != null && imovel.getCodigoDaFachada() != null) {

            if (imovel.getCodigoDaPosicao() != null || imovel.getCodigoDaPosicao() != null
                    || imovel.getCodigoDaPosicao() != 0) {

                //isolada-alinhada
                if (imovel.getCodigoDaPosicao() == 1 && imovel.getCodigoDaFachada() == 1) {
                    return new BigDecimal("0.9");
                    //isolada-recuada
                } else if (imovel.getCodigoDaPosicao() == 1 && imovel.getCodigoDaFachada() == 2) {
                    return new BigDecimal("1");
                    //geminada-alinhada
                } else if (imovel.getCodigoDaPosicao() == 2 && imovel.getCodigoDaFachada() == 1) {
                    return new BigDecimal("0.7");
                    //geminada-recuada
                } else if (imovel.getCodigoDaPosicao() == 2 && imovel.getCodigoDaFachada() == 2) {
                    return new BigDecimal("0.8");
                    //superposta- alinhada
                } else if (imovel.getCodigoDaPosicao() == 3 && imovel.getCodigoDaFachada() == 1) {
                    return new BigDecimal("0.8");
                    //superposta - recuada
                } else if (imovel.getCodigoDaPosicao() == 3 && imovel.getCodigoDaFachada() == 2) {
                    return new BigDecimal("0.9");
                    //conjugada-alinhada
                } else if (imovel.getCodigoDaPosicao() == 4 && imovel.getCodigoDaFachada() == 1) {
                    return new BigDecimal("0.8");
                    //conjugada-recuada
                } else if (imovel.getCodigoDaPosicao() == 4 && imovel.getCodigoDaFachada() == 2) {
                    return new BigDecimal("0.9");
                }

            } else {
                return new BigDecimal("1");
            }
        }
        return new BigDecimal("1");
    }

    public BigDecimal vveBairro(Imovel imovel) {

        if (imovel.getAreaDaUnidade().compareTo(BigDecimal.ZERO) == 0) {
            return BigDecimal.ZERO;
        }
        BigDecimal calc = imovel.getAreaDaUnidade().multiply(getBairro(imovel));

        calc = calc.multiply(caracteristicasImovel(imovel));
        calc = calc.multiply(conservacao(imovel));
        calc = calc.multiply(subtipo(imovel));
        return (calc);
    }

    public BigDecimal vve(Imovel imovel) {

        if (imovel.getAreaDaUnidade().compareTo(BigDecimal.ZERO) == 0) {
            return BigDecimal.ZERO;
        }
        BigDecimal calc = imovel.getAreaDaUnidade().multiply(vm2edificacao(imovel));

        calc = calc.multiply(caracteristicasImovel(imovel));
        calc = calc.multiply(conservacao(imovel));
        calc = calc.multiply(subtipo(imovel));
        return (calc);
    }

    public BigDecimal tcc(Imovel imovel) {
        return (indiceReferencia().multiply(imovel.getTestadaDoImovel())).multiply(new BigDecimal("0.02")).divide(new BigDecimal("1.0641"), 2, RoundingMode.HALF_UP);
    }

    public BigDecimal tcl(Imovel imovel) {
        return (indiceReferencia().multiply(imovel.getAreaDaUnidade())).multiply(new BigDecimal("0.01")).divide(new BigDecimal("1.0641"), 2, RoundingMode.HALF_UP);
    }

    public BigDecimal tlp(Imovel imovel) {
        return (indiceReferencia().multiply(imovel.getTestadaDoImovel())).multiply(new BigDecimal("0.02")).divide(new BigDecimal("1.0641"), 2, RoundingMode.HALF_UP);
    }

    public void verificarPendencia() {
        verificarContribuinte();
//        verificarFatorLocalizacao();
//        verificarEndereco();
        verificarPedologia();
//        verificarRevestimentoExterno();
//        verificarPisto();
//        verificarCobertura();
//        verificarInstalacaoSanitaria();
//        verificarTipoConstrucao();
//        verificarEstadoConservacao();
//        verificarInstalacaoEletrica();
//        verificarServicosUrbanos();
    }

    private void verificarServicosUrbanos() {
        String nao = "N";

        if (imovel.getCalcamento().equals(nao)) {
            Msg.messagemWarn("Verificar Calcamento!");
        }
        if (imovel.getIluminacaoPublica().equals(nao)) {
            Msg.messagemWarn("Verificar Iluminação Pública!");
        }
        if (imovel.getLimpezaPublica().equals(nao)) {
            Msg.messagemWarn("Verificar Limpesa Pública!");
        }
        if (imovel.getColetaDeLixo().equals(nao)) {
            Msg.messagemWarn("Verificar Coleta de lixo !");
        }
    }

    private void verificarInstalacaoEletrica() {
        if (imovel.getCodInstEletrica() == 1) {
            Msg.messagemWarn("Verificar Instalacao Elétrica!");
        }
    }

    private void verificarEstadoConservacao() {
        if (imovel.getCodEstadoConservacao() == 3) {
            Msg.messagemWarn("Verificar Estado de conservação !");
        }
    }

    private void verificarTipoConstrucao() {
        if (imovel.getCodigoTipoConstrucao() == 2) {
            Msg.messagemWarn("Verificar Tipo de Construção !");
        }
    }

    private void verificarInstalacaoSanitaria() {
        if (imovel.getCodigoInstSanitaria() == 1) {
            Msg.messagemWarn("Verificar Instalação Sanitária !");
        }
    }

    private void verificarCobertura() {
        if (imovel.getCodigoDaCobertura() == 1) {
            Msg.messagemWarn("Verificar Cobertura !");
        }
    }

    private void verificarPisto() {
        if (imovel.getCodigoPiso() == 1 || imovel.getCodigoPiso() == 4) {
            Msg.messagemWarn("Verificar Piso !");
        }
    }

    private void verificarRevestimentoExterno() {
        Integer revestimento = imovel.getCodRevestimento();
        if (revestimento == 1 || revestimento == 4 || revestimento == 5) {
            Msg.messagemWarn("Verificar revestimento externo !");
        }
    }

    private void verificarPedologia() {
        if (imovel.getCodigoDaPedologia() != 4) {
            Msg.messagemWarn("Pedologia diferente de \"Normal\" !");
        }
    }

    private void verificarEndereco() {
        Logradouro logradouroImovel = imovel.getCodigoLogradouro();
        Bairro bairro = imovel.getCodigoDoBairro();
        if (logradouroImovel == null) {
            if ((logradouroImovel.getNomeLogradouro() == null || logradouroImovel.getNomeLogradouro().isEmpty())
                    && (bairro == null && (bairro.getNomeDoBairro() != null && bairro.getNomeDoBairro().isEmpty()))) {
                Msg.messagemWarn("Endereço em branco / Não localizado !");
            }
        }
    }

    private void verificarFatorLocalizacao() {
        if (imovel.getFatorLocalizacao() != null
                && imovel.getFatorLocalizacao() != 18 && imovel.getFatorLocalizacao() != 24
                && imovel.getFatorLocalizacao() != 12) {
            Msg.messagemWarn("Fator de Localização baixo !");
        }
    }

    private void verificarContribuinte() {
        String cpfCnpj = imovel.getCodigoDoContribuinte().getCpfOuCnpj().trim();

        if (cpfCnpj != null && !cpfCnpj.isEmpty()) {

            if (cpfCnpj.length() < 11 && cpfCnpj.length() < 18) {
                Msg.messagemWarn("CPF/CNPJ do contribuinte é inválido !");
            } else {
                if (cpfCnpj.length() >= 11 && cpfCnpj.length() <= 14
                        && !CpfValidator.isValid(cpfCnpj)) {
                    Msg.messagemWarn("CPF inválido !");
                } else {
                    return;
                }
                if (cpfCnpj.length() > 14 && !CnpjValidator.isValid(cpfCnpj)) {
                    Msg.messagemWarn("CNPJ inválido !");
                }
            }
        } else {
            Msg.messagemWarn("CPF/CNPJ do contribuinte está em branco");
        }
    }

    public void prox() throws IOException {
        try{
        imovel = imovelServico.getByLocalizacao(localizacao);
        }catch(Exception e){
            Msg.messagemError("Não há registros!");
        }
    }

    
    public void atualizar() throws IOException {

//        imovel.setAtualizado(Boolean.TRUE);
        imovelServico.update(imovel);
//        removerIdArquivo(imovel.getId());

        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        context.redirect("editarimovel.xhtml");
    }

    public List<Imovel> getImoveis() {
        return lstImovel;
    }

    public void setImoveis(List<Imovel> imoveis) {
        this.lstImovel = imoveis;
    }

    public Imovel getImovel() {
        return imovel;
    }

    public void setImovel(Imovel imovel) {
        this.imovel = imovel;
    }

    public Contribuinte getContribuinte() {
        return contribuinte;
    }

    public void setContribuinte(Contribuinte contribuinte) {
        this.contribuinte = contribuinte;
    }

    public Logradouro getLogradouro() {
        return logradouro;
    }

    public void setLogradouro(Logradouro logradouro) {
        this.logradouro = logradouro;
    }

    public List<Mudanca> getMudancas() {
        return mudancas;
    }

    public void setMudancas(List<Mudanca> mudancas) {
        this.mudancas = mudancas;
    }

    public boolean isCobertura() {
        return cobertura;
    }

    public void setCobertura(boolean cobertura) {
        this.cobertura = cobertura;
    }

    public boolean isCpfCnpj() {
        return cpfCnpj;
    }

    public void setCpfCnpj(boolean cpfCnpj) {
        this.cpfCnpj = cpfCnpj;
    }

    public boolean isEstadoConservacao() {
        return estadoConservacao;
    }

    public void setEstadoConservacao(boolean estadoConservacao) {
        this.estadoConservacao = estadoConservacao;
    }

    public boolean isFatorLocalizacao() {
        return fatorLocalizacao;
    }

    public void setFatorLocalizacao(boolean fatorLocalizacao) {
        this.fatorLocalizacao = fatorLocalizacao;
    }

    public boolean isInstalacaoSanitaria() {
        return instalacaoSanitaria;
    }

    public void setInstalacaoSanitaria(boolean instalacaoSanitaria) {
        this.instalacaoSanitaria = instalacaoSanitaria;
    }

    public boolean isPedologia() {
        return pedologia;
    }

    public void setPedologia(boolean pedologia) {
        this.pedologia = pedologia;
    }

    public boolean isPisto() {
        return piso;
    }

    public void setPisto(boolean pisto) {
        this.piso = pisto;
    }

    public boolean isRevestimentoExterno() {
        return revestimentoExterno;
    }

    public void setRevestimentoExterno(boolean revestimentoExterno) {
        this.revestimentoExterno = revestimentoExterno;
    }

    public boolean isServicosUrbanos() {
        return servicosUrbanos;
    }

    public void setServicosUrbanos(boolean servicosUrbanos) {
        this.servicosUrbanos = servicosUrbanos;
    }

    public boolean isTipoConstrucao() {
        return tipoConstrucao;
    }

    public void setTipoConstrucao(boolean tipoConstrucao) {
        this.tipoConstrucao = tipoConstrucao;
    }

    public boolean isEndereco() {
        return endereco;
    }

    public void setEndereco(boolean endereco) {
        this.endereco = endereco;
    }

    public boolean isInstalacaoEletrica() {
        return instalacaoEletrica;
    }

    public void setInstalacaoEletrica(boolean instalacaoEletrica) {
        this.instalacaoEletrica = instalacaoEletrica;
    }

    public boolean isPiso() {
        return piso;
    }

    public void setPiso(boolean piso) {
        this.piso = piso;
    }
}
